package com.hzqx.syndata.proxy;

/**
 * @author yinzhiping
 */
public class TestProxy {
    /**
     * 代理在生活中随处可见，比如说我要买房，我一般不会直接和卖家对接，
     * 一般会和中介打交道，中介就是代理，卖家就是目标对象，我就是调用者，
     * 代理不仅实现了目标对象的行为（帮目标对象卖房），还可以添加上自己的动作（收保证金，签合同等）
     *
     * Client 是直接和 Proxy 打交道的，Proxy 是 Client 要真正调用的 RealSubject 的代理，
     * 它确实执行了 RealSubject 的 request 方法，
     * 不过在这个执行前后 Proxy 也加上了额外的 PreRequest()，afterRequest() 方法，
     * 注意 Proxy 和 RealSubject 都实现了 Subject 这个接口，
     * 这样在 Client 看起来调用谁是没有什么分别的（面向接口编程，对调用方无感，
     * 因为实现的接口方法是一样的），Proxy 通过其属性持有真正要代理的目标
     * 对象（RealSubject）以达到既能调用目标对象的方法也能在方法前后注入其它逻辑的目的。
     *
     * 首先 Java 源代码经过编译生成字节码，然后再由 JVM 经过类加载、连接，
     * 初始化成 Java 类型，可以看到字节码是关键，静态和动态的区别就在于字节码生成的时机。
     * 静态代理：由程序员创建代理类或特定工具自动生成源代码再对其编译。
     * 在编译时已经将接口、被代理类（委托类）、代理类等确定下来，在程序运行前代理类
     * 的.class文件就已经存在了。动态代理：在程序运行后通过反射创建生成字节码再由 JVM 加载而成。
     */
}
